{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Notebook for generating and saving SBM PATTERN graphs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import torch\n",
    "import pickle\n",
    "import time\n",
    "\n",
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "import scipy.sparse\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Generate SBM PATTERN graphs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'nb_clusters': 10, 'size_min': 5, 'size_max': 15, 'p': 0.5, 'q': 0.25, 'p_pattern': 0.5, 'q_pattern': 0.25, 'vocab_size': 3, 'size_subgraph': 10, 'W0': array([[0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],\n",
      "       [0., 0., 0., 1., 1., 0., 1., 0., 0., 1.],\n",
      "       [0., 0., 0., 1., 0., 0., 1., 1., 1., 1.],\n",
      "       [0., 1., 1., 0., 0., 1., 0., 0., 1., 0.],\n",
      "       [0., 1., 0., 0., 0., 1., 1., 1., 0., 0.],\n",
      "       [0., 0., 0., 1., 1., 0., 1., 1., 1., 0.],\n",
      "       [1., 1., 1., 0., 1., 1., 0., 0., 1., 1.],\n",
      "       [0., 0., 1., 0., 1., 1., 0., 0., 1., 0.],\n",
      "       [0., 0., 1., 1., 0., 1., 1., 1., 0., 1.],\n",
      "       [0., 1., 1., 0., 0., 0., 1., 0., 1., 0.]]), 'u0': array([1, 1, 2, 0, 2, 1, 2, 0, 2, 2])}\n",
      "<__main__.generate_SBM_graph object at 0x12247fd90>\n"
     ]
    }
   ],
   "source": [
    "\n",
    "def schuffle(W,c):\n",
    "    # relabel the vertices at random\n",
    "    idx=np.random.permutation( W.shape[0] )\n",
    "    #idx2=np.argsort(idx) # for index ordering wrt classes\n",
    "    W_new=W[idx,:]\n",
    "    W_new=W_new[:,idx]\n",
    "    c_new=c[idx]\n",
    "    return W_new , c_new , idx \n",
    "\n",
    "\n",
    "def block_model(c,p,q):\n",
    "    n=len(c)\n",
    "    W=np.zeros((n,n))\n",
    "    for i in range(n):\n",
    "        for j in range(i+1,n):\n",
    "            if c[i]==c[j]:\n",
    "                prob=p\n",
    "            else:\n",
    "                prob=q\n",
    "            if np.random.binomial(1,prob)==1:\n",
    "                W[i,j]=1\n",
    "                W[j,i]=1     \n",
    "    return W\n",
    "\n",
    "\n",
    "def unbalanced_block_model(nb_of_clust, clust_size_min, clust_size_max, p, q):  \n",
    "    c = []\n",
    "    for r in range(nb_of_clust):\n",
    "        if clust_size_max==clust_size_min:\n",
    "            clust_size_r = clust_size_max\n",
    "        else:\n",
    "            clust_size_r = np.random.randint(clust_size_min,clust_size_max,size=1)[0]\n",
    "        val_r = np.repeat(r,clust_size_r,axis=0)\n",
    "        c.append(val_r)\n",
    "    c = np.concatenate(c)  \n",
    "    W = block_model(c,p,q)  \n",
    "    return W,c\n",
    "\n",
    "\n",
    "def random_pattern(n,p):\n",
    "    W=np.zeros((n,n))\n",
    "    for i in range(n):\n",
    "        for j in range(i+1,n):\n",
    "            if np.random.binomial(1,p)==1:\n",
    "                W[i,j]=1\n",
    "                W[j,i]=1     \n",
    "    return W    \n",
    "\n",
    "\n",
    "    \n",
    "def add_pattern(W0,W,c,nb_of_clust,q):\n",
    "    n=W.shape[0]\n",
    "    n0=W0.shape[0]\n",
    "    V=(np.random.rand(n0,n) < q).astype(float)\n",
    "    W_up=np.concatenate(  ( W , V.T ) , axis=1 )\n",
    "    W_low=np.concatenate( ( V , W0  ) , axis=1 )\n",
    "    W_new=np.concatenate( (W_up,W_low)  , axis=0)\n",
    "    c0=np.full(n0,nb_of_clust)\n",
    "    c_new=np.concatenate( (c, c0),axis=0)\n",
    "    return W_new,c_new\n",
    "\n",
    "\n",
    "class generate_SBM_graph():\n",
    "\n",
    "    def __init__(self, SBM_parameters): \n",
    "\n",
    "        # parameters\n",
    "        nb_of_clust = SBM_parameters['nb_clusters']\n",
    "        clust_size_min = SBM_parameters['size_min']\n",
    "        clust_size_max = SBM_parameters['size_max']\n",
    "        p = SBM_parameters['p']\n",
    "        q = SBM_parameters['q']\n",
    "        p_pattern = SBM_parameters['p_pattern']\n",
    "        q_pattern = SBM_parameters['q_pattern']\n",
    "        vocab_size = SBM_parameters['vocab_size']\n",
    "        W0 = SBM_parameters['W0']\n",
    "        u0 = SBM_parameters['u0']\n",
    "\n",
    "        # block model\n",
    "        W, c = unbalanced_block_model(nb_of_clust, clust_size_min, clust_size_max, p, q)\n",
    "        \n",
    "        # signal on block model\n",
    "        u = np.random.randint(vocab_size, size=W.shape[0])\n",
    "        \n",
    "        # add the subgraph to be detected\n",
    "        W, c = add_pattern(W0,W,c,nb_of_clust,q_pattern)\n",
    "        u = np.concatenate((u,u0),axis=0)\n",
    "        \n",
    "        # shuffle\n",
    "        W, c, idx = schuffle(W,c)\n",
    "        u = u[idx]\n",
    "    \n",
    "        # target\n",
    "        target = (c==nb_of_clust).astype(float)\n",
    "        \n",
    "        # convert to pytorch\n",
    "        W = torch.from_numpy(W)\n",
    "        W = W.to(torch.int8)\n",
    "        idx = torch.from_numpy(idx) \n",
    "        idx = idx.to(torch.int16)\n",
    "        u = torch.from_numpy(u) \n",
    "        u = u.to(torch.int16)                      \n",
    "        target = torch.from_numpy(target)\n",
    "        target = target.to(torch.int16)\n",
    "        \n",
    "        # attributes\n",
    "        self.nb_nodes = W.size(0)\n",
    "        self.W = W\n",
    "        self.rand_idx = idx\n",
    "        self.node_feat = u\n",
    "        self.node_label = target\n",
    "        \n",
    "        \n",
    "# configuration\n",
    "SBM_parameters = {}\n",
    "SBM_parameters['nb_clusters'] = 10\n",
    "SBM_parameters['size_min'] = 5\n",
    "SBM_parameters['size_max'] = 15 # 25\n",
    "SBM_parameters['p'] = 0.5 # 0.5\n",
    "SBM_parameters['q'] = 0.25 # 0.1\n",
    "SBM_parameters['p_pattern'] = 0.5 # 0.5\n",
    "SBM_parameters['q_pattern'] = 0.25 # 0.1    \n",
    "SBM_parameters['vocab_size'] = 3\n",
    "SBM_parameters['size_subgraph'] = 10\n",
    "SBM_parameters['W0'] = random_pattern(SBM_parameters['size_subgraph'],SBM_parameters['p_pattern'])\n",
    "SBM_parameters['u0'] = np.random.randint(SBM_parameters['vocab_size'],size=SBM_parameters['size_subgraph'])\n",
    "        \n",
    "print(SBM_parameters)\n",
    "\n",
    "\n",
    "\n",
    "data = generate_SBM_graph(SBM_parameters)\n",
    "\n",
    "print(data)\n",
    "#print(data.nb_nodes)\n",
    "#print(data.W)\n",
    "#print(data.rand_idx)\n",
    "#print(data.node_feat)\n",
    "#print(data.node_label)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
      "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
      "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
      "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,\n",
      "        1, 1, 1, 1, 1, 1, 1, 1, 1], dtype=torch.int16)\n"
     ]
    }
   ],
   "source": [
    "#Plot Adj matrix\n",
    "\n",
    "W = data.W\n",
    "plt.spy(W,precision=0.01, markersize=1)\n",
    "plt.show()\n",
    "\n",
    "idx = np.argsort(data.rand_idx) \n",
    "W = data.W\n",
    "W2 = W[idx,:]\n",
    "W2 = W2[:,idx]\n",
    "plt.spy(W2,precision=0.01, markersize=1)\n",
    "plt.show()\n",
    "\n",
    "target = data.node_label\n",
    "target = target[idx]\n",
    "print(target)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'nb_clusters': 5, 'size_min': 5, 'size_max': 35, 'p': 0.5, 'q': 0.35, 'p_pattern': 0.5, 'q_pattern': 0.5, 'vocab_size': 3, 'size_subgraph_min': 5, 'size_subgraph_max': 35}\n",
      "pattern: 0\n",
      "pattern: 1\n",
      "pattern: 2\n",
      "pattern: 3\n",
      "pattern: 4\n",
      "pattern: 5\n",
      "pattern: 6\n",
      "pattern: 7\n",
      "pattern: 8\n",
      "pattern: 9\n",
      "pattern: 10\n",
      "pattern: 11\n",
      "pattern: 12\n",
      "pattern: 13\n",
      "pattern: 14\n",
      "pattern: 15\n",
      "pattern: 16\n",
      "pattern: 17\n",
      "pattern: 18\n",
      "pattern: 19\n",
      "pattern: 20\n",
      "pattern: 21\n",
      "pattern: 22\n",
      "pattern: 23\n",
      "pattern: 24\n",
      "pattern: 25\n",
      "pattern: 26\n",
      "pattern: 27\n",
      "pattern: 28\n",
      "pattern: 29\n",
      "pattern: 30\n",
      "pattern: 31\n",
      "pattern: 32\n",
      "pattern: 33\n",
      "pattern: 34\n",
      "pattern: 35\n",
      "pattern: 36\n",
      "pattern: 37\n",
      "pattern: 38\n",
      "pattern: 39\n",
      "pattern: 40\n",
      "pattern: 41\n",
      "pattern: 42\n",
      "pattern: 43\n",
      "pattern: 44\n",
      "pattern: 45\n",
      "pattern: 46\n",
      "pattern: 47\n",
      "pattern: 48\n",
      "pattern: 49\n",
      "pattern: 50\n",
      "pattern: 51\n",
      "pattern: 52\n",
      "pattern: 53\n",
      "pattern: 54\n",
      "pattern: 55\n",
      "pattern: 56\n",
      "pattern: 57\n",
      "pattern: 58\n",
      "pattern: 59\n",
      "pattern: 60\n",
      "pattern: 61\n",
      "pattern: 62\n",
      "pattern: 63\n",
      "pattern: 64\n",
      "pattern: 65\n",
      "pattern: 66\n",
      "pattern: 67\n",
      "pattern: 68\n",
      "pattern: 69\n",
      "pattern: 70\n",
      "pattern: 71\n",
      "pattern: 72\n",
      "pattern: 73\n",
      "pattern: 74\n",
      "pattern: 75\n",
      "pattern: 76\n",
      "pattern: 77\n",
      "pattern: 78\n",
      "pattern: 79\n",
      "pattern: 80\n",
      "pattern: 81\n",
      "pattern: 82\n",
      "pattern: 83\n",
      "pattern: 84\n",
      "pattern: 85\n",
      "pattern: 86\n",
      "pattern: 87\n",
      "pattern: 88\n",
      "pattern: 89\n",
      "pattern: 90\n",
      "pattern: 91\n",
      "pattern: 92\n",
      "pattern: 93\n",
      "pattern: 94\n",
      "pattern: 95\n",
      "pattern: 96\n",
      "pattern: 97\n",
      "pattern: 98\n",
      "pattern: 99\n",
      "10000 2000 2000\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Time (sec): 157.89826607704163\n"
     ]
    }
   ],
   "source": [
    "# Generate and save SBM graphs\n",
    "\n",
    "class DotDict(dict):\n",
    "    def __init__(self, **kwds):\n",
    "        self.update(kwds)\n",
    "        self.__dict__ = self\n",
    "\n",
    "def plot_histo_graphs(dataset, title):\n",
    "    # histogram of graph sizes\n",
    "    graph_sizes = []\n",
    "    for graph in dataset:\n",
    "        graph_sizes.append(graph.nb_nodes)\n",
    "    plt.figure(1)\n",
    "    plt.hist(graph_sizes, bins=50)\n",
    "    plt.title(title)\n",
    "    plt.show()\n",
    "\n",
    "    \n",
    "\n",
    "\n",
    "start = time.time()\n",
    "\n",
    "\n",
    "# configuration for 100 patterns 100/20 \n",
    "nb_pattern_instances = 100 # nb of patterns\n",
    "nb_train_graphs_per_pattern_instance = 100 # train per pattern\n",
    "nb_test_graphs_per_pattern_instance = 20 # test, val per pattern\n",
    "\n",
    "# # debug\n",
    "# nb_pattern_instances = 10 # nb of patterns\n",
    "# nb_train_graphs_per_pattern_instance = 10 # train per pattern\n",
    "# nb_test_graphs_per_pattern_instance = 2 # test, val per pattern\n",
    "# # debug\n",
    "\n",
    "SBM_parameters = {}\n",
    "SBM_parameters['nb_clusters'] = 5 \n",
    "SBM_parameters['size_min'] = 5 \n",
    "SBM_parameters['size_max'] = 35 \n",
    "#SBM_parameters['p'] = 0.5 # v1\n",
    "#SBM_parameters['q'] = 0.2 # v1\n",
    "#SBM_parameters['p'] = 0.5 # v2\n",
    "#SBM_parameters['q'] = 0.5 # v2\n",
    "#SBM_parameters['p'] = 0.5; SBM_parameters['q'] = 0.25 # v3\n",
    "SBM_parameters['p'] = 0.5; SBM_parameters['q'] = 0.35 # v4\n",
    "SBM_parameters['p_pattern'] = 0.5 \n",
    "SBM_parameters['q_pattern'] = 0.5  \n",
    "SBM_parameters['vocab_size'] = 3 \n",
    "#SBM_parameters['size_subgraph'] = 20 # v1\n",
    "SBM_parameters['size_subgraph_min'] = 5 # v2\n",
    "SBM_parameters['size_subgraph_max'] = 35 # v2\n",
    "print(SBM_parameters)\n",
    "    \n",
    "\n",
    "dataset_train = []\n",
    "dataset_val = []\n",
    "dataset_test = []\n",
    "for idx in range(nb_pattern_instances):\n",
    "    \n",
    "    print('pattern:',idx)\n",
    "    \n",
    "    #SBM_parameters['W0'] = random_pattern(SBM_parameters['size_subgraph'],SBM_parameters['p']) # v1\n",
    "    #SBM_parameters['u0'] = np.random.randint(SBM_parameters['vocab_size'],size=SBM_parameters['size_subgraph']) # v1\n",
    "    size_subgraph = np.random.randint(SBM_parameters['size_subgraph_min'],SBM_parameters['size_subgraph_max'],size=1)[0] # v2\n",
    "    SBM_parameters['W0'] = random_pattern(size_subgraph,SBM_parameters['p']) # v2\n",
    "    SBM_parameters['u0'] = np.random.randint(SBM_parameters['vocab_size'],size=size_subgraph) # v2\n",
    "    \n",
    "    for _ in range(nb_train_graphs_per_pattern_instance):\n",
    "        data = generate_SBM_graph(SBM_parameters)\n",
    "        graph = DotDict()\n",
    "        graph.nb_nodes = data.nb_nodes\n",
    "        graph.W = data.W\n",
    "        graph.rand_idx = data.rand_idx\n",
    "        graph.node_feat = data.node_feat\n",
    "        graph.node_label = data.node_label\n",
    "        dataset_train.append(graph)\n",
    "\n",
    "    for _ in range(nb_test_graphs_per_pattern_instance):\n",
    "        data = generate_SBM_graph(SBM_parameters)\n",
    "        graph = DotDict()\n",
    "        graph.nb_nodes = data.nb_nodes\n",
    "        graph.W = data.W\n",
    "        graph.rand_idx = data.rand_idx\n",
    "        graph.node_feat = data.node_feat\n",
    "        graph.node_label = data.node_label\n",
    "        dataset_val.append(graph)\n",
    "\n",
    "    for _ in range(nb_test_graphs_per_pattern_instance):\n",
    "        data = generate_SBM_graph(SBM_parameters)\n",
    "        graph = DotDict()\n",
    "        graph.nb_nodes = data.nb_nodes\n",
    "        graph.W = data.W\n",
    "        graph.rand_idx = data.rand_idx\n",
    "        graph.node_feat = data.node_feat\n",
    "        graph.node_label = data.node_label\n",
    "        dataset_test.append(graph)\n",
    "\n",
    "\n",
    "print(len(dataset_train),len(dataset_val),len(dataset_test))\n",
    "\n",
    "\n",
    "plot_histo_graphs(dataset_train,'train')\n",
    "plot_histo_graphs(dataset_val,'val')\n",
    "plot_histo_graphs(dataset_test,'test')\n",
    "\n",
    "\n",
    "with open('SBM_PATTERN_train.pkl',\"wb\") as f:\n",
    "    pickle.dump(dataset_train,f)\n",
    "with open('SBM_PATTERN_val.pkl',\"wb\") as f:\n",
    "    pickle.dump(dataset_val,f)\n",
    "with open('SBM_PATTERN_test.pkl',\"wb\") as f:\n",
    "    pickle.dump(dataset_test,f)\n",
    "    \n",
    "    \n",
    "print('Time (sec):',time.time() - start) # 163s\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
